package primitive3D;

import static rayTracer.ApplicationInterface.*;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import rayTracer.AABB;
import rayTracer.Ray;
import rayTracer.Transformation;

public class Plane extends Primitive3D {
	Vector3d normal;
	
	public Plane(Point3d p, Vector3d n){
		position = p;
		n.normalize();
		normal = new Vector3d(n);
		name = new String("");
		components = null;		
		
		//Ver si tiene sentido el AABB para el plano
		double[] dmin = new double[]{-10, -10, -10};
		double[] dmax = new double[]{10, 10, 10};
		
		bb = new AABB(new Point3d(dmin), new Point3d(dmax) );
	}
	
	@Override
	// Devuelve la distancia al punto intersectado en el nombre de
	// la funcion. Si no hay interseccion devuelve -1.  
	public double intersects(Ray ray) {	
		//Calculo el punto de interseccion entre un plano y el rayo usando:
		// k = -(vecNormal.OrigenRayo + d)/(vecNormal.DirRayo)

		// Si el denominador da 0 es porque el rayo es paralelo al plano,
		// entonces o no lo corta, o lo corta en infinitos puntos
		double denominador = normal.dot(ray.vecDir);
		if( denominador == 0 )
			return 0;

		// d = - vecNormal.PtoDelPlano, position es el pto central del plano 
		Vector3d vecPoint = new Vector3d(position);
		double d = -normal.dot(vecPoint);

		// Para que el rayo corte al triangulo debe ser k>=0
		Vector3d vecOrigin = new Vector3d(ray.origin);
		double k = -(normal.dot(vecOrigin) + d)/denominador;
		if( k < 0 )
			return -1;
		else
			return k;
	}
	
	// Devuelve un vector normal a la superficie del plano que pasa por p
	// p debe ser un punto de la superficie del plano
	public Vector3d getNormal(Point3d p) {
		return this.normal;
	}
	
	@Override
	public void scaleFromReferencePosition(Point3d referencePosition,
			double scaleFactor) {		
	}

	@Override
	public void setPosition(Point3d otherPosition) {
		position = new Point3d(otherPosition);
	}

	@Override
	public String toString() {
		StringBuffer str = new StringBuffer();
		
		str.append("Plane \"" + getName() + "\""+" p="+position+" n="+normal );
		return str.toString();
	}
	@Override
	public int transform(Transformation trans) {
		// TODO Auto-generated method stub
		return 0;
	}

}
